#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"

void InitSList(SL* p)
{
	p->a = (SLDatatype *)malloc(sizeof(SLDatatype) * 4);
	p->sz = 0;
	p->capacity = 4;
}
void CheckCapacity(SL* p)
{
	assert(p);
	if (p->capacity == p->sz)
	{
		SL* tmp = (SLDatatype*)realloc(p->a, sizeof(SLDatatype) * p->capacity * 2);
		if (tmp == NULL)
		{
			printf("realloc fail");
			return;
		}
		tmp = p->a;
		p->capacity *= 2;
	}
}
void DestorySList(SL* p)
{
	assert(p);
	free(p->a);
	p->a = NULL;
	p->sz = 0;
	p->capacity = 0;

}
void PrintSList(SL* p)
{
	assert(p);
	for (int i = 0; i < p->sz; i++)
	{
		printf("%d ", p->a[i]);
	}
	printf("\n");
}

void InsertSList(SL* p, int pos, SLDatatype x)
{
	assert(p);
	assert(pos>=0&&pos<=p->sz);
	CheckCapacity(p);
	int end = p->sz;
	while (pos < end)
	{
		p->a[end] = p->a[end - 1];
		end--;
	}
	p->a[pos] = x;
	p->sz++;
}

void EraseSList(SL* p, int pos) 
{
	assert(p);
	assert(pos >= 0 && pos <= p->sz);
	int start = pos + 1;
	while (start < p->sz)
	{
		p->a[start - 1] = p->a[start];
		++start;
	}
	p->sz--;
}

void PushBackSList(SL* p, SLDatatype x)
{
	assert(p);
	CheckCapacity(p);
	InsertSList(p, p->sz, x);
}


void PopBackSList(SL* p)
{
	assert(p);
	EraseSList(p, p->sz);
}
void PushFrontSList(SL* p, SLDatatype x)
{
	assert(p);
	CheckCapacity(p);
	InsertSList(p, 0, x);

}
void PopFrontSList(SL* p)
{
	assert(p);
	EraseSList(p, 0);
}
int FindSList(SL* p, SLDatatype x)
{
	assert(p);
	for (int i = 0; i < p->sz; i++)
	{
		if (p->a[i]== x)
		{
			return i;
		}
	}
	return -1;
}

void ModifySList(SL* p, int pos, SLDatatype x)
{
	assert(p);
	assert(pos >= 0 && pos <= p->sz);
	p->a[pos] = x;
}